package week7.ui;

/**
 * Abstractie van een commando in een tekstueel gebruikersinterface. Het commando bestaat uit een enkele letter en 0 tot 2 parameters.
 * Practicumopgave Programmeren I
 * @author W.Looge & R. Oost
 * @version 1.0
 */
public abstract class Commando {
	
	/**
	 * String met de opgegeven beschrijving van dit commando.
	 * @invariant beschrijving != null
	 */
	private String beschrijving;
	
	/**
	 * int met het opgegeven aantal parameters dat dit commando accepteert.
	 * @invariant 0 <= aantalPars <= 2
	 */
	private int aantalPars;
	
	/** char met het opgegeven teken dat voorafgaat aan dit commando. */
	private char teken;
	
	/**
	 * Construeert een commando dat gegeven is door een bepaald teken en een
	 * bepaald aantal parameters hoort te krijgen, en met een gegeven beschrijving.
	 * @param teken Het teken dat voor dit commando staat
	 * @param aantalPars Het aantal parameters van dit commando
	 * @param beschrijving Korte beschrijving van parameters en commando
	 * @require 0 <= aantalPars <= 2 && beschrijving != null && teken is uniek
	 * @ensure this.getTeken() == teken && this.getBeschrijving() == beschrijving && this.getAantalPars() == aantalPars
	 */
	protected Commando(char teken, int aantalPars, String beschrijving) {
		this.aantalPars = aantalPars;
		this.beschrijving = beschrijving;
		this.teken = teken;
	}
	
	/**
	 * Levert het aantal parameters dat dit commando verwacht. Hier is gekozen
	 * voor een parametertal tussen de 0 en 2.
	 * @return int Het aantal parameters dat dit commando verwacht
	 * @ensure 0 <= result <= 2
	 */
	public int getAantalPars() {
		return this.aantalPars;
		
	}
	
	/**
	 * Levert het karakteristieke teken van dit commando. Dit dient kenmerkend
	 * te zijn voor het commando; d.w.z., twee verschillende commando's moeten
	 * niet hetzelfde teken hebben.
	 * @return char Het karakteristieke teken
	 */
	public char getTeken() {
		return this.teken;
		
	}
	
	/**
	 * Korte beschrijving van parameters en commando. De beschrijving dient te
	 * bestaan uit een enkele regel, waarop aantal en aard van de benodigde
	 * parameters worden uitgelegd, en de bedoeling van het commando wordt
	 * beschreven.
	 * @return String Beschrijving van het commando
	 * @ensure result != null
	 */
	public String getBeschrijving() {
		return this.beschrijving;
		
	}
	
	/**
	 * Geeft aan of een gegeven combinatie van teken en parameters een geldige
	 * aanroep van dit commando vormt. Als het teken wel klopt maar het aantal
	 * parameters niet dan wordt een foutboodschap geprint.
	 * @param teken het teken van het uit te voeren commando
	 * @param par1 De eerste parameter van de aanroep, of null
	 * @param par2 De tweede parameter van de aanroep, of null
	 * @return true Als teken samen met par1 en par2 een geldige aanroep van dit commando vormen
	 * @require Als par1 == null dan par2 == null
	 * @ensure result == (teken == this.getTeken()) && ( getAantalPars() == 0 && par1 == null || getAantalPars() == 1 && par1 != null && par2 == null || getAantalPars() == 2 && par2 != null)
	 */
	public boolean kanUitvoeren(char teken, String par1, String par2) {
		boolean b0 = (getAantalPars() == 0 && par1 == null);					// Situatie met 0 parameters
		boolean b1 = (getAantalPars() == 1 && par1 != null && par2 == null);	// Situatie met 1 parameters
		boolean b2 = (getAantalPars() == 2 && par2 != null);					// Situatie met 2 parameters
		
		return (teken == this.getTeken()) && (b0 || b1 || b2);
	}

	/**
	 * Voert dit commando uit, met gegeven parameters.
	 * @param par1 De eerste parameter van de aanroep, of null
	 * @param par2 De tweede parameter van de aanroep, of null
	 * @require this.kanUitvoeren(this.getTeken(), par1, par2)
	 */
	public abstract void voerUit(String par1, String par2);
}
